package fr.auzaiphe.admin.controller;

import java.util.ArrayList;

import javax.swing.JTextField;

import fr.auzaiphe.admin.model.AdminModel;
import fr.auzaiphe.admin.model.Alerte;
import fr.auzaiphe.admin.model.Indice;
import fr.auzaiphe.admin.model.Joueur;
import fr.auzaiphe.commun.Controller;
import fr.auzaiphe.commun.PopUpFilePath;
import fr.auzaiphe.commun.reseau.PacketChat;

/**
 * Controlleur principal de l'application.
 *
 * @author Jojo
 */
public class AdminController extends Controller
{
	/**
	 * Constructeur
	 * @param pModel
	 */
	public AdminController( AdminModel pModel )
	{
		this.model = pModel;
	}

	/**
	 * Envoie du message au model
	 * @param pText texte tapé par l'utilisateur
	 */
	public void send( String pText )
	{
		String textePropre = pText.trim();

		if ( textePropre != "" )
		{
			((AdminModel)this.model).getClient().send( new PacketChat( textePropre, ((AdminModel)this.model).getClient().getSocket().getInetAddress(),
					((AdminModel)this.model).getClient().getPseudo() ) );
		}
	}

	/**
	 * ferme proprement la base de donnée
	 * supprime le dossier temp
	 */
	public void closeBDD()
	{
		((AdminModel)this.model).closeBDD();
	}

	/**
	 * Lance le JFileChooser en mode enregistrer-sous
	 */
	public void enregistrerSous()
	{
		new PopUpFilePath( this, PopUpFilePath.SAVE_AS );
	}

	/**
	 * Lance le JFileChooser en mode ouverture .murder
	 */
	public void charger()
	{
		new PopUpFilePath( this, PopUpFilePath.LOAD_FILE );
	}

	/**
	 * Sauvegarde le projet
	 */
	public void enregistrer()
	{
		if ( !((AdminModel)this.model).getScenario().getBdd().getNomFichierASauvegarder().equals("") )
		{
			((AdminModel)this.model).enregistrer();
		}
		else
		{
			this.enregistrerSous();
		}
	}

	/**
	 * Ouvre un nouveau fichier .murder et ferme l'ancien
	 */
	public void ouvrirNouveau()
	{
		((AdminModel)this.model).ouvrirNouveau();
	}

	/**
	 * Recupère le temps du chrono de l'apply admin
	 */
	public int getTempsChrono()
	{
		return ((AdminModel)this.model).getScenario().getChrono().getSecondesRestantes();
	}

	/**
	 * Utilisée pour l'ajout de joueur via interface.
	 */
	public ArrayList<String> getJoueurs()
	{
		ArrayList<String[]> joueurs = ((AdminModel)this.model).getJoueurs();
		ArrayList<String> listRet = new ArrayList<String>();
		for(String[] j : joueurs)
		{
			listRet.add(j[0]+" "+j[1]);
		}
		return listRet;
	}

	/**
	 * Ajouter un joueur
	 * @param pNomPersonnage - nom du personnage
	 * @param pPrenomPersonnage - prenom du personnage
	 * @param pPassword - mot de passe du personnage pour la connexion lors de la partie
	 * @param pMinute - Nombre de minutes de connexion
	 * @param pSeconde - Nombre de secondes de connexion
	 * @param pBackground - Description du background du personnage
	 */
	public void addJoueur( String pNomPersonnage, String pPrenomPersonnage, String pPassword,
						   String pMinute, String pSeconde, String pBackground )
	{
		// Transformation des données venant de la vue
		int temps = Integer.parseInt( pMinute ) * 60 + Integer.parseInt( pSeconde );

		// Envoie des données au model
		((AdminModel)this.model).addJoueur( pNomPersonnage, pPrenomPersonnage, pBackground , pPassword,
						   				  temps);
	}

	public void addAlerte(boolean pCibleAll,
						  boolean pCibleAdmin,
						  String pNomJoueur,
						  String pPrenomJoueur,
						  String pNomChrono,
						  String pPrenomChrono,
						  int pActivation,
						  String pTitre,
						  String pTexte,
						  String pLienFichier)
	{
		((AdminModel)this.model).addAlerte(pCibleAll, pCibleAdmin, pNomJoueur, pPrenomJoueur, pNomChrono, pPrenomChrono, pActivation,pTitre, pTexte, pLienFichier);
	}

	/**
	 * Mise à jour d'un joueur
	 * @param pNomPersonnage - nom du personnage
	 * @param pPrenomPersonnage - prenom du personnage
	 * @param pPassword - mot de passe du personnage pour la connexion lors de la partie
	 * @param pMinute - Nombre de minutes de connexion
	 * @param pSeconde - Nombre de secondes de connexion
	 * @param pBackground - Description du background du personnage
	 */
	public void updateJoueur(String pOldNom,String pOldPrenom,  String pNomPersonnage, String pPrenomPersonnage, String pPassword,
						   String pMinute, String pSeconde, String pBackground )
	{
		// Transformation des données venant de la vue
		int temps = Integer.parseInt( pMinute ) * 60 + Integer.parseInt( pSeconde );

		// Envoie des données au model
		((AdminModel)this.model).updateJoueur( pOldNom, pOldPrenom, pNomPersonnage, pPrenomPersonnage, pBackground , pPassword,
						   				  temps);
	}

	public void addIndice(ArrayList<String> pJoueursVisibles,
						  ArrayList<String> pJoueursLies,
						  String pTitre,
						  String pContenu,
						  String pLienFichier,
						  int pDebutVie,
						  int pFinVie)
	{
		((AdminModel)this.model).addIndice
		(
			((AdminModel)this.model).getScenario().StringToJoueur( pJoueursVisibles ),
			((AdminModel)this.model).getScenario().StringToJoueur( pJoueursLies ),
			pContenu,
			pLienFichier,
			pTitre,
			pDebutVie,
			pFinVie,
			0,
			0
		);
	}

	/**
	 * Supprime le joueur passé en paramètre
	 * @param pJoueurSupprime
	 */
	public void supprimerJoueur(Joueur pJoueurSupprime)
	{
		((AdminModel)this.model).supprimerJoueur( pJoueurSupprime );
	}

	/**
	 * Supprime l'indice passé en paramètre
	 * @param pIndiceSupprime
	 */
	public void supprimerIndice(Indice pIndiceSupprime)
	{
		((AdminModel)this.model).supprimerIndice( pIndiceSupprime );
	}

	/**
	 *
	 * @param pNom
	 * @param pPrenom
	 * @return
	 */
	public Joueur getJoueur(String pNom, String pPrenom)
	{
		return ((AdminModel)this.model).getScenario().getJoueur( pNom, pPrenom );
	}

	/**
	 * Supprime l'alerte passé en paramètre
	 * @param alerteSupprime
	 */
	public void supprimerAlerte(Alerte alerteSupprime)
	{
		((AdminModel)this.model).supprimerAlerte( alerteSupprime );
	}
	/**
	 *
	 * @param pNom
	 * @return
	 */
	public Alerte getAlerte(String pNom)
	{
		return ((AdminModel)this.model).getScenario().getAlerte( pNom);
	}
	/**
	 *
	 * @param pContenuScenario
	 * @param pChronoHeure
	 * @param pChronoMinute
	 */
	public void saveScenario( String pContenuScenario, String pChronoHeure, String pChronoMinute )
	{
		((AdminModel)this.model).saveScenario( pContenuScenario,
				Integer.parseInt(pChronoHeure) * 3600 + Integer.parseInt( pChronoMinute ) * 60 );
	}

	/**
	 *
	 * @param pId
	 * @return
	 */
	public Indice getIndice(int pId)
	{
		return ((AdminModel)this.model).getScenario().getIndice(pId);
	}

	/**
	 * Mise à jour d'un indice
	 * @param pId
	 * @param joueursVisibles
	 * @param joueursLies
	 * @param pTitre
	 * @param pContenu
	 * @param pPath
	 * @param pDebut
	 * @param pFin
	 */
	public void updateIndice(int pId,
												 ArrayList<String> pJoueursVisibles,
												 ArrayList<String> pJoueursLies,
												 String pTitre,
												 String pContenu,
												 String pPath,
												 int pDebut,
												 int pFin)
	{
		// Envoie des données au model
		((AdminModel)this.model).updateIndice(pId,
																				((AdminModel)this.model).getScenario().StringToJoueur( pJoueursVisibles ),
																				((AdminModel)this.model).getScenario().StringToJoueur( pJoueursLies ),
																				pTitre,
																				((AdminModel)this.model).getScenario().toContenu( pPath, pContenu),
																				pDebut,
																				pFin);
	}

	/**
	 * Mise à jour d'une alerte
	 * @param pId
	 * @param pCibleAll
	 * @param pCibleAdmin
	 * @param pNomJoueur
	 * @param pPrenomJoueur
	 * @param pNomChrono
	 * @param pPrenomChrono
	 * @param pActivation
	 * @param pTitre
	 * @param pTexte
	 * @param pLienFichier
	 */
	public void updateAlerte(
							int pId,
							boolean pCibleAll,
							boolean pCibleAdmin,
							String pNomJoueur,
							String pPrenomJoueur,
							String pNomChrono,
							String pPrenomChrono,
							int pActivation,
							String pTitre,
							String pTexte,
							String pLienFichier)
	{
		((AdminModel)this.model).updateAlerte(pId,pCibleAll, pCibleAdmin, pNomJoueur, pPrenomJoueur, pNomChrono, pPrenomChrono, pActivation,pTitre, pTexte, pLienFichier);
	}

	public void updatePrice(int pPrix)
	{
		((AdminModel)this.model).updatePrice(pPrix);
	}

	/**
	 * Remplis le pTargetField avec le retour de la popUpFilePath.
	 * @param pTargetedField
	 */
	public void parcourir(JTextField pTargetedField)
	{
		new PopUpFilePath(pTargetedField);
	}

	/**
	 * Demarre le chrono
	 */
	public void lancerPartie()
	{
		((AdminModel)this.model).lancerPartie();
	}

	/**
	 * Stop le chrono
	 */
	public void stopperPartie()
	{
		((AdminModel)this.model).stopperPartie();
	}
}